package cevent.source.cloudcenter.server.service;

import cevent.source.cloudcenter.server.domain.CategoryModule;
import cevent.source.cloudcenter.server.domain.CategoryModuleExample;
import cevent.source.cloudcenter.server.dto.CategoryChildrenDto;
import cevent.source.cloudcenter.server.dto.CategoryDto;
import cevent.source.cloudcenter.server.dto.CategoryModuleDto;
import cevent.source.cloudcenter.server.dto.PageDto;
import cevent.source.cloudcenter.server.mapper.CategoryModuleMapper;
import cevent.source.cloudcenter.server.util.DuplicateUtil;
import cevent.source.cloudcenter.server.util.UUID8Util;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

/**
 * @author cevent
 * @description 模块分类关联表服务层
 */
@Service
public class CategoryModuleService {
    private static final Logger LOG=LoggerFactory.getLogger(CategoryModuleService.class);
    @Resource
    private CategoryModuleMapper categoryModuleMapper;

    //1.无分页列表查询：dto获取domain参数
    public List<CategoryModuleDto> categoryModuleDtoList(){
        CategoryModuleExample categoryModuleExample = new CategoryModuleExample();
        categoryModuleExample.setOrderByClause("uni_id asc");
        List<CategoryModule> categoryModuleList=categoryModuleMapper.selectByExample(categoryModuleExample);
        List<CategoryModuleDto> categoryModuleDtoList = new ArrayList<CategoryModuleDto>();
        for(int i=0;i<categoryModuleList.size();i++){
            CategoryModule categoryModule=categoryModuleList.get(i);
            CategoryModuleDto categoryModuleDto=new CategoryModuleDto();
            //复制拷贝(source,target)
            BeanUtils.copyProperties(categoryModule,categoryModuleDto);
            categoryModuleDtoList.add(categoryModuleDto);
        }
        return categoryModuleDtoList;
    }

    /*2.分页查询：pageDto保存数据
        list数据集合：listPageData
        当前页码：currentPage
        每页行数：size
        总计函数：totalSize
        前端可返回pageDto，无需返回值
     */
    public void getCategoryModulePageDtoList(PageDto pageDto){
        //1.分页设置（前端传入当前页和每页行数params），起始页，每页行数size
        PageHelper.startPage(pageDto.getCurrentPage(),pageDto.getSize());

        CategoryModuleExample categoryModuleExample=new CategoryModuleExample();


        List<CategoryModule> categoryModuleList=categoryModuleMapper.selectByExample(categoryModuleExample);
        //2.将mapper查询结果复制到pageInfo
        PageInfo<CategoryModule> pageInfo=new PageInfo<>(categoryModuleList);
        //3.pageInfo计算处理处理=>后分页的总行数set到pageDto做记录
        pageDto.setTotalSize(pageInfo.getTotal());

        List<CategoryModuleDto> categoryModuleDtoList=new ArrayList<>();
        categoryModuleList.stream().forEach(categoryModule->{
            CategoryModuleDto categoryModuleDto=new CategoryModuleDto();
            BeanUtils.copyProperties(categoryModule,categoryModuleDto);
            categoryModuleDtoList.add(categoryModuleDto);
        });

        pageDto.setListPageData(categoryModuleDtoList);

    }

    //3.新增、修改categoryModule，将传入的id转为categoryModule对象本身
    public void save(CategoryModuleDto categoryModuleDto){
        CategoryModule categoryModule= DuplicateUtil.copy(categoryModuleDto,CategoryModule.class);
        if(StringUtils.isEmpty(categoryModuleDto.getUniId())){
            this.insert(categoryModule);
        }else{
            this.update(categoryModule);
        }

    }

    //4.删除模块
    public void delete(String uniId){
        CategoryModuleExample categoryModuleExample=new CategoryModuleExample();
        categoryModuleMapper.deleteByPrimaryKey(uniId);
    }

    //5.向外暴露dto，不暴露实体类：插入数据
    private void insert(CategoryModule categoryModule){
        categoryModule.setUniId(UUID8Util.getShortUUID());
        categoryModuleMapper.insert(categoryModule);
    }

    //6.更新模块
    private void update(CategoryModule categoryModule){

        categoryModuleMapper.updateByPrimaryKey(categoryModule);
    }

    //批量保存module传入的category属性,由于同时执行循环多条sql，需要加事务安全处理
    @Transactional
    public void saveBath(String moduleUniId , List<CategoryChildrenDto> categoryChildrenDtoList){
        //1.如果为更新操作，需要先清空之前的categoryModule数据
        CategoryModuleExample categoryModuleExample=new CategoryModuleExample();
        //根据传入的moduleId删除
        categoryModuleExample.createCriteria().andModuleUniIdEqualTo(moduleUniId);
        categoryModuleMapper.deleteByExample(categoryModuleExample);

        //2.循环插入分类模块关联表,将页面传入的category属性传入categoryDto
        for(int i=0;i<categoryChildrenDtoList.size();i++){
            CategoryDto categoryDto=categoryChildrenDtoList.get(i);
            CategoryModule categoryModule=new CategoryModule();
            categoryModule.setUniId(UUID8Util.getShortUUID());
            categoryModule.setModuleUniId(moduleUniId);
            categoryModule.setCategoryUniId(categoryDto.getUniId());
            insert(categoryModule);
        }
    }

    //查询module所属分类
    public List<CategoryModuleDto> getCategoryModuleDtoList(String moduleUniId){
        CategoryModuleExample categoryModuleExample=new CategoryModuleExample();
        categoryModuleExample.createCriteria().andModuleUniIdEqualTo(moduleUniId);
        List<CategoryModule> categoryModuleList=categoryModuleMapper.selectByExample(categoryModuleExample);
        List<CategoryModuleDto> categoryModuleDtoList=DuplicateUtil.copyList(categoryModuleList,CategoryModuleDto.class);
        return categoryModuleDtoList;
    }
}
